Hadoop安装与配置(二) 1.1搭建zookeeper集群 (1)下载并解压zookeeper 到官网(地址:http://Zookeeper.apache.org/releases.html# download)下载Zookeeper稳定版本的apache-zookeeper-3.8.4-bin.tar.gz安装包,然后上传至hadoop1 节点的/home/hadoop/app目录下并解压,具体操作如下所示。 #解压Zookeeper [hadoop@hadoop1 app]$ tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz #创建Zookeeper软连接 [hadoop@hadoop1 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper (2)修改zoo.cfg配置文件 在运行 Zookeeper 服务之前,需要新建一个配置文件。这个配置文件习惯上命名为zoo.cfg,并保存在conf子目录中,其核心内容如下所示。 [hadoop@hadoop1 app]$ cd zookeeper [hadoop@hadoop1 zookeeper]$ cd conf/ [hadoop@hadoop1 conf]$ ls configuration.xsl logback.xml zoo_sample.cfg [hadoop@hadoop1 conf]$ cp zoo_sample.cfg zoo.cfg [hadoop@hadoop1 conf]$ vi zoo.cfg #数据目录需要提前创建 dataDir=/home/hadoop/data/zookeeper/zkdata #日志目录需要提前创建 dataLogDir=/home/hadoop/data/zookeeper/zkdatalog #访问端口号 clientPort=2181 #server.每个节点服务编号=服务器ip地址:集群通信端口:选举端口 server.1=hadoop1:2888:3888 server.2=hadoop2:2888:3888 server.3=hadoop3:2888:3888 具体操作步骤如图1-1所示。 图1-1 修改zoo.cfg配置文件 (3)同步zookeeper安装目录 使用scp命令将hadoop1节点的Zookeeper安装目录,整体同步到集群的hadoop2和hadoop3节点,具体操作如下所示。 方法1:使用远程拷贝命令scp,操作步骤如下。 [hadoop@hadoop1 app]$scp -r zookeeper-3.4.6 hadoop@hadoop2:/home/hadoop/app/ [hadoop@hadoop1 app]$scp -r zookeeper-3.4.6 hadoop@hadoop3:/home/hadoop/app/ 方法2:使用集群脚本,操作步骤如下。 [hadoop@hadoop1 app]$ deploy.sh apache-zookeeper-3.8.4-bin /home/hadoop/app/ slave 然后分别在hadoop2和hadoop3节点上创建Zookeeper软连接,具体操作如下所示。 [hadoop@hadoop2 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper [hadoop@hadoop3 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper (4)创建数据和日志目录 在集群各个节点创建Zookeeper数据目录和日志目录,需要跟zoo.cfg配置文件保持一致,具体操作如下所示。 #创建Zookeeper数据目录 方法1:三个节点分别创建。 [hadoop@hadoop1 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata [hadoop@hadoop2 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata [hadoop@hadoop3 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata 方法2:使用集群脚本。 [hadoop@hadoop1 ~]$ runRemoteCmd.sh 'mkdir -p /home/hadoop/data/zookeeper/zkdata' all 执行效果如图1-2所示。 图1-2 创建zkdata目录 #创建Zookeeper日志目录 方法1: [hadoop@hadoop1 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog [hadoop@hadoop2 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog [hadoop@hadoop3 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog 方法2:(必须安装配置相应脚本工具) [hadoop@hadoop1 ~]$ runRemoteCmd.sh 'mkdir -p /home/hadoop/data/zookeeper/zkdatalog' all 执行效果如图1-3所示。 图1-3 创建zkdatalog目录 (5)创建各节点服务编号 分别在Zookeeper集群各个节点,进入/home/hadoop/data/zookeeper/zkdata目录,创建文件myid,然后分别输入服务编号,具体操作如下所示: #hadoop1节点 [hadoop@hadoop1 zkdata]$ touch myid [hadoop@hadoop1 zkdata]$ echo 1 > myid #hadoop2节点 [hadoop@hadoop2 zkdata]$ touch myid [hadoop@hadoop2 zkdata]$ echo 2 > myid #hadoop3节点 [hadoop@hadoop3 zkdata]$ touch myid [hadoop@hadoop3 zkdata]$ echo 3 > myid 注意:每个节点服务编号的值是一个整形数字且不能重复。 (6)启动Zookeeper集群服务 1)在集群各个节点分别进入Zookeeper安装目录,然后使用如下命令启动Zookeeper服务。 方法1: [hadoop@hadoop1 zookeeper]$ bin/zkServer.sh start [hadoop@hadoop2 zookeeper]$ bin/zkServer.sh start [hadoop@hadoop3 zookeeper]$ bin/zkServer.sh start 方法2: [hadoop@hadoop1 ~]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh start' all 执行效果如图1-4所示。 图1-4 启动zookeeper集群 2)Zookeeper集群启动一会之后,通过如下命令查看Zookeeper集群状态。 方法1: [hadoop@hadoop:1 zookeeper]$ bin/zkServer.sh status [hadoop@hadoop2 zookeeper]$ bin/zkServer.sh status [hadoop@hadoop3 zookeeper]$ bin/zkServer.sh status 方法2: [hadoop@hadoop1 ~]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh status' all 执行效果如图1-5所示。 图1-5 查看zookeeper集群状态 如果在Zookeeper集群中,其中一个节点为leader领导者,另外两个节点是follower跟随者,说明Zookeeper集群安装部署成功。 1.2搭建完全分布式Hadoop集群 1.1.1 HDFS集训搭建 (1)下载解压Hadoop 首先到官网(地址:https://archive.apache.org/dist/hadoop/common/)下载Hadoop稳定版本的安装包,然后上传至hadoop1节点下的/home/hadoop/app目录下并解压,具体操作如下所示。 [hadoop@hadoop1 app]$ tar -zxvf hadoop-3.3.1.tar.gz //解压 [hadoop@hadoop1 app]$ ln -s hadoop-3.3.1 hadoop //创建软连接 [hadoop@hadoop1 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/ //切换到配置目录 (2)修改HDFS配置文件 1)修改hadoop-env.sh配置文件。hadoop-env.sh文件主要配置跟hadoop环境相关的变量,这里主要修改JAVA_HOME的安装目录,具体操作如下所示。 [hadoop@hadoop1 hadoop]$ vi hadoop-env.sh export JAVA_HOME=/home/hadoop/app/jdk 2)修改core-site.xml配置文件。core-site.xml文件主要配置hadoop的公有属性,具体需要配置的每个属性如下所示。 [hadoop@hadoop1 hadoop]$ vi core-site.xml fs.defaultFS hdfs://mycluster hadoop.tmp.dir /home/hadoop/data/tmp ha.zookeeper.quorum hadoop1:2181,hadoop2:2181,hadoop3:2181 3)修改hdfs-site.xml配置文件。hdfs-site.xml文件主要配置跟HDFS相关的属性,具体需要配置的每个属性如下所示。 [hadoop@hadoop1 hadoop]$ vi hdfs-site.xml dfs.namenode.name.dir file:/home/hadoop/data/dfs/name dfs.datanode.data.dir file:/home/hadoop/data/dfs/data dfs.journalnode.edits.dir /home/hadoop/data/journaldata/jn dfs.nameservices mycluster dfs.ha.namenodes.mycluster nn1,nn2,nn3 dfs.namenode.rpc-address.mycluster.nn1 hadoop1:8020 dfs.namenode.rpc-address.mycluster.nn2 hadoop2:8020 dfs.namenode.rpc-address.mycluster.nn3 hadoop3:8020 dfs.namenode.http-address.mycluster.nn1 hadoop1:9870 dfs.namenode.http-address.mycluster.nn2 hadoop2:9870 dfs.namenode.http-address.mycluster.nn3 hadoop3:9870 dfs.namenode.shared.edits.dir qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.ha.fencing.methods sshfence dfs.ha.fencing.ssh.private-key-files /home/hadoop/.ssh/id_rsa dfs.ha.automatic-failover.enabled true dfs.permissions.enabled false 4)配置workers文件。workers文件是根据集群规划配置DataNode节点所在的主机名,具体操作如下所示。 [hadoop@hadoop1 hadoop]$ vi workers hadoop1 hadoop2 hadoop3 5)向所有节点远程复制Hadoop安装目录。在hadoop1节点,切换到/home/hadoop/app目录下,将Hadoop安装目录远程复制到hadoop2和hadoop3节点,具体操作如下两种方法: 方法1: [hadoop@hadoop1 app]$scp -r hadoop-3.3.1 hadoop@hadoop2:/home/hadoop/app/ [hadoop@hadoop1 app]$scp -r hadoop-3.3.1 hadoop@hadoop3:/home/hadoop/app/ 方法2: [hadoop@hadoop1 hadoop]$ deploy.sh /home/hadoop/app/hadoop-3.3.1 /home/hadoop/app slave 然后在hadoop2和hadoop3节点上分别创建软连接,具体操作如下所示。 [hadoop@hadoop2 app]$ ln -s hadoop-3.3.1 hadoop [hadoop@hadoop3 app]$ ln -s hadoop-3.3.1 hadoop 备注:复制前删除使用rm -rf hadoop hadoop-3.3.1命令hadoop1、hadoop2上的hadoop hadoop-3.3.1目录 1.1.2 启动HDFS集群服务 (1)启动Zookeeper集群 在集群所有节点分别启动Zookeeper服务,具体操作如下所示。 方法1:分别在三个节点启动。 [hadoop@hadoop1 zookeeper]$ bin/zkServer.sh start [hadoop@hadoop2 zookeeper]$ bin/zkServer.sh start [hadoop@hadoop3 zookeeper]$ bin/zkServer.sh start 方法2:使用远程执行脚本。 [hadoop@hadoop1 hadoop]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh start ' all (2)启动Journalnode集群 在集群所有节点分别启动Journalnode服务,具体操作如下所示。 方法1:分别在三个节点启动。 [hadoop@hadoop1 hadoop]$sbin/hadoop-daemon.sh start journalnode [hadoop@hadoop2 hadoop]$sbin/hadoop-daemon.sh start journalnode [hadoop@hadoop3 hadoop]$sbin/hadoop-daemon.sh start journalnode 方法2:使用远程执行脚本。 [hadoop@hadoop1 hadoop]$ runRemoteCmd.sh '/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode' all (3)格式化主节点NameNode 在hadoop1节点(NameNode主节点)上,使用如下命令对NameNode进行格式化。 [hadoop@hadoop1 hadoop]$ bin/hdfs namenode -format / /n amenode 格式化 [hadoop@hadoop1 hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用 [hadoop@hadoop1 hadoop]$bin/hdfs namenode //启动namenode (4)备用NameNode同步主节点元数据 在hadoop1节点启动NameNode服务的同时,需要在hadoop2,hadoop3节点(NameNode备用节点)上执行如下命令同步主节点的元数据。 [hadoop@hadoop2 hadoop]$ bin/hdfs namenode -bootstrapStandby [hadoop@hadoop3 hadoop]$ bin/hdfs namenode -bootstrapStandby (5)关闭Journalnode集群 hadoop2节点同步完主节点元数据之后,紧接着在hadoop1节点上,按下〈Ctrl+C〉组合键来结束NameNode进程,然后关闭所有节点上面的Journalnode进程,具体操作如下所示。 [hadoop@hadoop1 hadoop]$sbin/hadoop-daemon.sh stop journalnode [hadoop@hadoop2 hadoop]$ sbin/hadoop-daemon.sh stop journalnode [hadoop@hadoop3 hadoop]$ sbin/hadoop-daemon.sh stop journalnode (6)一键启动HDFS集群 如果上面操作没有问题,在hadoop1节点上,可以使用脚本一键启动HDFS集群所有相关进程,具体操作下所示。 [hadoop@hadoop1 hadoop]$ sbin/start-dfs.sh 注意:第一次安装HDFS需要对NameNode进行格式化,HDFS集群安装成功之后,以后使用start-dfs.sh脚本一键启动HDFS集群的所有进程即可。 1.1.3 HDFS集群测试 在浏览器中分别输入网址http://hadoop1:9870,以及http://hadoop3:9870通过 Web 界面查看hadoop1、hadoop3节点的NameNode的状态,结果如图1-6所示。该节点的状态为standby,表示HDFS不能通过hadoop1节点的NameNode对外提供服务。 图1-6 standby状态的NameNode界面 在浏览器中输入网址http://hadoop2:9870,通过Web界面查看hadoop2节点的NameNode的状态,结果如图2-54所示。该节点的状态为active,表示hadoop2节点的NameNode可以对外提供服务。 图1-7 active状态的NameNode界面 注意:某一时刻只能有一个NameNode节点处于active状态。 在hadoop1节点的/home/hadoop/app/hadoop目录下创建words.log文件,然后上传至 HDFS文件系统的/test目录下,检查 HDFS是否能正常使用,具体操作如下: #本地新建words.log文件 [hadoop@hadoop1 hadoop]$ vi words.log hadoop hadoop hadoop spark spark spark flink flink flink [hadoop@hadoop1 hadoop]$ hdfs dfs -mkdir /test #上传本地文件words.log [hadoop@hadoop1 hadoop]$ hdfs dfs -put words.log /test #查看words.log是否上传成功 [hadoop@hadoop1 hadoop]$ hdfs dfs -ls /test /test/words.log 如果上面操作没有异常,说明HDFS分布式集群搭建成功。 1.1.4 YARN集群配置 (1)修改 mapred-site.xml配置文件 mapred-site.xml 文件主要配置跟 MapReduce 相关的属性,这里主要将MapReduce的运行环境指定为YARN,核心配置如下所示。 [hadoop@hadoop1 hadoop]$ vi mapred-site.xml mapreduce.framework.name yarn (2)修改 yarn-site.xml配置文件 yarn-site.xml 文件主要配置跟YARN 相关的属性,核心配置如下所示。 [hadoop@hadoop1 hadoop]$ vi yarn-site.xml yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.ha.enabled true yarn.resourcemanager.cluster-id cluster-yarn1 yarn.resourcemanager.ha.rm-ids rm1,rm2,rm3 yarn.resourcemanager.hostname.rm1 hadoop1 yarn.resourcemanager.webapp.address.rm1 hadoop1:8088 yarn.resourcemanager.address.rm1 hadoop1:8032 yarn.resourcemanager.scheduler.address.rm1 hadoop1:8030 yarn.resourcemanager.resource-tracker.address.rm1 hadoop1:8031 yarn.resourcemanager.hostname.rm2 hadoop2 yarn.resourcemanager.webapp.address.rm2 hadoop2:8088 yarn.resourcemanager.address.rm2 hadoop2:8032 yarn.resourcemanager.scheduler.address.rm2 hadoop2:8030 yarn.resourcemanager.resource-tracker.address.rm2 hadoop2:8031 yarn.resourcemanager.hostname.rm3 hadoop3 yarn.resourcemanager.webapp.address.rm3 hadoop3:8088 yarn.resourcemanager.address.rm3 hadoop3:8032 yarn.resourcemanager.scheduler.address.rm3 hadoop3:8030 yarn.resourcemanager.resource-tracker.address.rm3 hadoop3:8031 yarn.resourcemanager.zk-address hadoop1:2181,hadoop2:2181,hadoop3:2181 yarn.resourcemanager.recovery.enabled true yarn.resourcemanager.store.class org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore yarn.nodemanager.env-whitelist JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLAS SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME (3)向所有节点同步YARN配置文件 在hadoop1节点上修改完YARN相关配置之后,将修改的配置文件远程复制到hadoop2节点和hadoop3节点,具体操作如下所示。 #将 mapred-site.xml文件远程复制到hadoop2和hadoop3节点 方法1: [hadoop@hadoop1 hadoop]$scp -r mapred-site.xml hadoop@hadoop2:/home/hadoop/app/hadoop/etc/hadoop [hadoop@hadoop1 hadoop]$scp -r mapred-site.xml hadoop@hadoop3:/home/hadoop/app/hadoop/etc/hadoop 方法2: [hadoop@hadoop1 hadoop]$ deploy.sh mapred-site.xml /home/hadoop/app/hadoop/etc/hadoop/ slave #将yarn-site.xml文件远程复制到hadoop2和hadoop3节点 方法1: [hadoop@hadoop1 hadoop]$scp -r yarn-site.xml hadoop@hadoop2:/home/hadoop/app/hadoop/etc/hadoop [hadoop@hadoop1 hadoop]$scp -r yarn-site.xml hadoop@hadoop3:/home/hadoop/app/hadoop/etc/hadoop 方法2: [hadoop@hadoop1 hadoop]$ deploy.sh yarn-site.xml /home/hadoop/app/hadoop/etc/hadoop/ slave 1.1.5 启动YARN集群服务 YARN HA的实现依赖于Zookeeper,所以需要优先启动Zookeeper集群。因为前面操作已经启动Zookeeper集群,所以该步骤可以跳过。 启动YARN集群 在hadoop1节点上,使用脚本一键启动YARN集群,具体操作如下所示。 [hadoop@hadoop1 hadoop]$ sbin/start-yarn.sh 1.1.6 YARN集群测试 (1)Web界面查看YARN集群 在浏览器中输入网址http://hadoop1:8088(或者http://hadoop2:8088;http://hadoop3:8088),通过 Web 界面查看YARN集群信息,结果如图1-8所示。 图1-8 Web界面查看YARN集群 (2)YARN集群测试 为了测试YARN集群是否可以正常运行MapReduce程序,我们以Hadoop自带的wordcount示例来进行演示,具体操作如图1-9所示。 [hadoop@hadoop1 hadoop]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /test/words.log /test/out 图1-9 YARN集群运行wordcount MapReduce作业在YARN集群执行状态结果,如图1-10所示。 图1-10 MapReduce作业运行状态 如果上述操作没有异常,最终作业的状态信息显示为SUCCEEDED,就说明MapReduce程序在YARN集群上面运行成功,从而说明Hadoop分布式集群已经全部搭建成功。 通过命令查询执行结果: [hadoop@hadoop1 hadoop]$ bin/hdfs dfs -cat /test/out/* 执行结果如图1-11所示。 图1-11MapReduce作业运行结果 II